package com.hangxintong.common.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 标记接口.
 * 用于标记{@link SystemException}对象的错误码参数类型,防止错误码串用.
 * @author lvyanfei
 * @date 2021-01-04
 */
public interface SystemErrorCodeMark extends ErrorInfo {

    /**
     * 系统异常错误码枚举
     */
    @Getter
    @AllArgsConstructor
    enum Code implements SystemErrorCodeMark {
        /**
         * 系统错误(本系统).
         */
        SYSTEM_ERROR_LOCAL(500, "系统异常"),
        /**
         * 系统内部错误(其他服务引起的错误,如通道异常)
         */
        SYSTEM_ERROR_OTHER(501, "系统繁忙"),

        /**
         * 系统内部错误
         */
        SYS_0001(500),
        /**
         * API不存在
         */
        SYSTEM_NOT_API(502 , "API不存在"),
        /**
         * 保存数据失败
         */
        SYSTEM_SAVE_DATA_ERROR(900,"保存数据失败"),
        /**
         * API不存在
         */
        HTTP_NOT_SUPPORTED(503 , "HTTP请求方法不支持"),
       SYSTEM_QUERY_DATA_ERROR(508 , "查询数据为空"),
        //**********会员单位标识************
        DATA_NOT_EXIST(10086 , "数据不存在"),
        COMPANY_APP_ASSOC_NOT_EXIST(10001 , "会员协会关系不存在"),
        MEMBER_COMPANY_NOT_EXIST(10002 , "会员单位不存在"),
        MEMBER_COMPANY_LEVEL_NOT_EXIST(10003 , "会员等级不存在"),
        MEMBER_COMPANY_QUERY_LINKPERSON_FAIL(10009,"查询联系人失败"),
        //********************消息提示***********************
        INFO_DATA_NOT_EXIST(10010,"消息数据不存在"),

//        HTTP_NOT_SUPPORTED("503" , "HTTP请求方法不支持"),


        COMPANY_APP_ASSOC_EXIST(10010 , "会员协会关系已存在"),
        USER_NO_PERMISSION(10011,"无权限操作!"),


        COMPANY_APP_MEMBER_CHANGE_INFO_NOT_EXIST(10011 , "申请记录不存在"),
        /**
         * 认证资源重复
         */
        COMPANY_EXISTS(504,"企业信息存在"),

//        /**
//         * 等级不存在
//         */
//        LEVEL_NOT_EXISTS(505,"设置等级不存在"),

        /**
         * 等级拒绝新用户加入
         */
        LEVEL_NOT_ACCEPT(505,"该等级拒绝新用户加入"),

//        /**
//         * 企业信息不存在
//         */
//        COMPANY_NOT_EXISTS("506","企业信息不存在"),


        MEMBER_COMPANY_LEVEL_APPLY_EXIST(10004 , "已申请升降级"),
        /**
         * 缺少必要参数
         */
        SYSTEM_PARAMETER_NOT_NULL(10100 , "缺少必要参数"),
        SYSTEM_CODE_NOT_EXISTIS(10101 , "验证码错误"),

        //###############################################会员会费===============================
        MEMBER_DUES_GENERATE_BILLS_FAIL(10025,"生成缴费账单失败"),
        MEMBER_DUES_QUERY_COMPANY_FAIL(10026,"您的协会下没有会员"),
        MEMBER_DUES_QUERY_BILLS_FAIL(10027,"查询账单信息异常"),
        MEMBER_DUES_QUERY_ASSOC_FAIL(10028,"查询协会信息失败"),
        MEMBER_DUES_CONTENT_TEMPLATE(10029,"请先设置通知内容模板"),
        MEMBER_DUES_LEVEL_PRICE_TEMPLATE(10030,"请先设置通知会费等级模板"),
        MEMBER_DUES_GENERATE_NOTES_DATA_FAIL(10031,"生成会费通知信息失败"),
        MEMBER_DUES_QUERY_NOTES_DATA_FAIL(10032,"查询通知消息记录失败"),
        MEMBER_DUES_NOTES_DATA_EDIT_STATUS_FAIL(10034,"修改阅读状态失败"),


        /**
         * 活动类标签 sta
         * @param
         */
        //###############################################插件消息提示##############################
        PLUG_DATA_IS_EXIST(10200,"该插件数据已存在~"),
        PLUG_DATA_IS_UPDATE_EXIST(100201,"没有可更新的插件数据~"),
        PLUG_DATA_IS_NOT_EXIST(100202,"没有插件数据~"),
        //活动分类不存在
        ACTIVITY_CATEGORY_NOT_EXISTS(10040,"活动分类信息不存在"),
        //标签信息已存在
        ACTIVITY_LABEL_EXISTS(10041,"标签信息已存在"),
        //标签信息不存在
        ACTIVITY_LABEL_NOT_EXISTS(10042,"标签信息不存在"),
        //活动信息不存在
        ACTIVITY_INFO_NOT_EXISTS(10043,"活动信息不存在"),
        //酒店信息不存在
        ACTIVITY_HOTEL_NOT_EXISTS(10044,"酒店信息不存在"),

        /**
         * 活动类标签结束 end
         * @param errorCode
         */
        ;



        Code(Integer errorCode) {
            this.errorCode = errorCode;
//            this.errorDesc = "aaa";
        }

        /**
         * 错误码.
         */
        private Integer errorCode;
        /**
         * 错误码对应的外部描述信息,该信息是通过错误码自动获取,并且直接返回给调用方.
         */
        private String errorDesc;
    }

    /**
     * 快速构建一个自定义错误描述错误信息对象.
     * <p>
     *   一般用于相同的错误码,但是不同的错误描述信息(类似).
     *   比如常见的参数错误,但是可以使用参数错误的通用错误码在描述中提示调用者更具体的错误描述.
     * </p>
     * @param desc      新的错误描述
     * @return 使用自定义描述替换原有描述的信息对象副本
     */
    default SystemErrorCodeMark as(String desc) {
        ErrorInfo errorInfo = this;
        return new SystemErrorCodeMark() {
            @Override
            public Integer getErrorCode() {
                return errorInfo.getErrorCode();
            }

            @Override
            public String getErrorDesc() {
                return desc;
            }
        };
    }
}
